package com.gitee.W_Jun.question;

/**
 * @author https://gitee.com/W_Jun
 * @date 2021-12-25 17:24
 * @Description 方法中定义的局部变量是否线程安全？-具体问题具体分析
 * 何为线程安全？
 *  如果只有一个线程才可以操作此数据，则必是线程安全的。
 *  如果有多个线程操作此数据，则此数据是共享数据。如果不考虑同步机制的话，会存在线程安全问题。
 */
public class StringBuilderTest {
    //method1方法中定义的s1是线程安全的
    public static void method1() {
        //StringBuilder线程不安全.而StringBuffer是线程安全的，就没有讨论的必要了
        StringBuilder s1 = new StringBuilder();
        s1.append("a");
        s1.append("b");
    }

    //sBuilder的操作过程是线程不安全的，因为sBuilder是从外部传过来的，可能外部有其他线程使用
    public static void method2(StringBuilder sBuilder) {
        sBuilder.append("a");
        sBuilder.append("b");
    }

    //s1的操作是线程不安全的
    public static StringBuilder method3() {
        StringBuilder s1 = new StringBuilder();
        s1.append("a");
        s1.append("b");
        return s1;//因为这里把s1返回出去了，可能会被其他线程操作
    }

    //这个s1是线程安全的
    public static String  method4() {
        StringBuilder s1 = new StringBuilder();
        s1.append("a");
        s1.append("b");
        //可以查看toString()的源码，是new了一个新的String
        return s1.toString();//因为这里把s1调用了toString方法再返回出去，s1已经消亡了
    }
    public static void main(String[] args) {
        StringBuilder s = new StringBuilder();
        new Thread(() -> {
            s.append("a");
            s.append("b");
        }).start();
        method2(s);
    }
}
